]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
Refresh all background instances after suspend if needed
authorRui Matos <tiagomatos@gmail.com>
Thu, 19 Mar 2015 14:46:08 +0000 (15:46 +0100)
committerRui Matos <tiagomatos@gmail.com>
Tue, 24 Mar 2015 10:45:04 +0000 (11:45 +0100)
NVIDIA drivers don't preserve FBO contents across suspend / resume
cycles which results in broken backgrounds. We can work around that by
forcing a refresh when coming out of suspend.

https://bugzilla.gnome.org/show_bug.cgi?id=739178

js/ui/layout.js
src/shell-util.c
src/shell-util.h

index a4abc280ad893e2e36615ae9bf69f8c9cc1d9c46..204665fa0aa861007a71d56ce2f5d8ce79d63568 100644 (file)
@@ -11,6 +11,7 @@ const St = imports.gi.St;
 
 const Background = imports.ui.background;
 const BackgroundMenu = imports.ui.backgroundMenu;
+const LoginManager = imports.misc.loginManager;
 
 const DND = imports.ui.dnd;
 const Main = imports.ui.main;
@@ -273,6 +274,18 @@ const LayoutManager = new Lang.Class({
         global.screen.connect('in-fullscreen-changed',
                               Lang.bind(this, this._updateFullscreen));
         this._monitorsChanged();
+
+        // NVIDIA drivers don't preserve FBO contents across
+        // suspend/resume, see
+        // https://bugzilla.gnome.org/show_bug.cgi?id=739178
+        if (Shell.util_need_background_refresh()) {
+            LoginManager.getLoginManager().connect('prepare-for-sleep',
+                                                   function(lm, suspending) {
+                                                       if (suspending)
+                                                           return;
+                                                       Meta.Background.refresh_all();
+                                                   });
+        }
     },
 
     // This is called by Main after everything else is constructed
index f1afed071d6507f27c7937ab9f5981ecb43582d5..b0b90d6144f3b7048b62b01c87919acf64286477 100644 (file)
@@ -5,6 +5,9 @@
 #include <sys/types.h>
 #include <sys/wait.h>
 
+#include <GL/gl.h>
+#include <cogl/cogl.h>
+
 #include "shell-util.h"
 #include <glib/gi18n-lib.h>
 #include <gtk/gtk.h>
@@ -358,3 +361,33 @@ shell_util_cursor_tracker_to_clutter (MetaCursorTracker *tracker,
       clutter_actor_hide (CLUTTER_ACTOR (texture));
     }
 }
+
+typedef const gchar *(*ShellGLGetString) (GLenum);
+
+static const gchar *
+get_gl_vendor (void)
+{
+  static const gchar *vendor = NULL;
+
+  if (!vendor)
+    {
+      ShellGLGetString gl_get_string;
+      gl_get_string = (ShellGLGetString) cogl_get_proc_address ("glGetString");
+      if (gl_get_string)
+        vendor = gl_get_string (GL_VENDOR);
+    }
+
+  return vendor;
+}
+
+gboolean
+shell_util_need_background_refresh (void)
+{
+  if (!clutter_check_windowing_backend (CLUTTER_WINDOWING_X11))
+    return FALSE;
+
+  if (g_strcmp0 (get_gl_vendor (), "NVIDIA Corporation") == 0)
+    return TRUE;
+
+  return FALSE;
+}
index 153278eb2194b0a56fa2ad736e551394da08e4a0..e7d3cc9fb9bf6efe12cf5b7a1af07f765d6212d6 100644 (file)
@@ -45,6 +45,8 @@ GdkPixbuf *shell_util_create_pixbuf_from_data (const guchar      *data,
 void    shell_util_cursor_tracker_to_clutter (MetaCursorTracker *tracker,
                                               ClutterTexture    *texture);
 
+gboolean shell_util_need_background_refresh (void);
+
 G_END_DECLS
 
 #endif /* __SHELL_UTIL_H__ */